#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
自定义数据源示例
展示如何扩展系统，添加新的关键词数据源
"""

import sys
import os

# 添加src目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))

from data_sources import DataSource, create_data_source
from utils import load_config, setup_logging


class GoogleSuggestionsSource(DataSource):
    """Google搜索建议数据源示例"""
    
    def __init__(self, config):
        super().__init__("Google建议", config)
    
    def collect_keywords(self, keyword: str) -> list:
        """从Google搜索建议获取关键词"""
        # 这里实现Google搜索建议的采集逻辑
        # 由于Google有反爬虫机制，这里只是示例框架
        suggestions = []
        
        try:
            # 实现Google搜索建议采集逻辑
            # 可以使用requests + 代理，或者Playwright
            pass
        except Exception as e:
            self.logger.error(f"获取Google建议失败: {e}")
        
        return suggestions


class BingRelatedSource(DataSource):
    """Bing相关搜索数据源示例"""
    
    def __init__(self, config):
        super().__init__("Bing相关搜索", config)
    
    def collect_keywords(self, keyword: str) -> list:
        """从Bing相关搜索获取关键词"""
        # 实现Bing相关搜索采集逻辑
        related_keywords = []
        
        try:
            # 使用Playwright访问Bing搜索页面
            from playwright.sync_api import sync_playwright
            from utils import get_user_agent
            
            with sync_playwright() as p:
                browser = p.chromium.launch(headless=True)
                context = browser.new_context(user_agent=get_user_agent())
                page = context.new_page()
                
                # 访问Bing搜索页面
                page.goto(f"https://www.bing.com/search?q={keyword}")
                
                # 查找相关搜索
                # 这里需要根据Bing的实际页面结构调整选择器
                elements = page.query_selector_all(".b_algo h2 a")
                for element in elements:
                    text = element.text_content().strip()
                    if text and len(text) > 1:
                        related_keywords.append(text)
                
                browser.close()
                
        except Exception as e:
            self.logger.error(f"获取Bing相关搜索失败: {e}")
        
        return related_keywords


class WeiboTopicsSource(DataSource):
    """微博话题数据源示例"""
    
    def __init__(self, config):
        super().__init__("微博话题", config)
    
    def collect_keywords(self, keyword: str) -> list:
        """从微博话题获取关键词"""
        topics = []
        
        try:
            # 实现微博话题采集逻辑
            # 注意：微博可能需要登录或特殊处理
            pass
        except Exception as e:
            self.logger.error(f"获取微博话题失败: {e}")
        
        return topics


def demonstrate_custom_sources():
    """演示如何使用自定义数据源"""
    print("🚀 自定义数据源扩展示例")
    print("=" * 50)
    
    # 加载配置
    config = load_config()
    logger = setup_logging(config)
    
    # 1. 使用工厂函数创建数据源
    print("\n1️⃣ 使用工厂函数创建数据源:")
    google_source = create_data_source('google_suggestions', config)
    if google_source:
        print(f"✅ 成功创建: {google_source.name}")
    else:
        print("❌ 未知的数据源类型")
    
    # 2. 直接创建自定义数据源
    print("\n2️⃣ 直接创建自定义数据源:")
    bing_source = BingRelatedSource(config)
    print(f"✅ 创建了: {bing_source.name}")
    
    # 3. 测试数据源功能
    print("\n3️⃣ 测试数据源功能:")
    test_keyword = "Python编程"
    
    # 测试Bing相关搜索
    print(f"正在测试 {bing_source.name}...")
    keywords = bing_source.collect_keywords(test_keyword)
    print(f"获取到 {len(keywords)} 个关键词")
    if keywords:
        print(f"示例: {keywords[:3]}")
    
    # 4. 展示如何集成到现有系统
    print("\n4️⃣ 集成到现有系统:")
    print("在 data_sources.py 中添加:")
    print("""
    # 在 source_map 中添加新数据源
    source_map = {
        'baidu_suggestions': BaiduSuggestionsSource,
        'baidu_related': BaiduRelatedSource,
        'search360': Search360Source,
        'zhihu_topics': ZhihuTopicsSource,
        'google_suggestions': GoogleSuggestionsSource,  # 新增
        'bing_related': BingRelatedSource,             # 新增
        'weibo_topics': WeiboTopicsSource              # 新增
    }
    """)
    
    print("\n5️⃣ 在配置文件中启用/禁用数据源:")
    print("""
    data_collection:
      sources:
        google_suggestions:
          enabled: true
          api_key: "your_api_key"  # 如果需要
        bing_related:
          enabled: true
        weibo_topics:
          enabled: false  # 暂时禁用
    """)


def show_extension_patterns():
    """展示扩展模式"""
    print("\n🔧 扩展模式说明:")
    print("=" * 50)
    
    print("""
1. 继承 DataSource 基类:
   class YourSource(DataSource):
       def __init__(self, config):
           super().__init__("数据源名称", config)
       
       def collect_keywords(self, keyword: str) -> List[str]:
           # 实现你的采集逻辑
           pass

2. 实现必要的方法:
   - collect_keywords(): 核心采集方法
   - get_source_info(): 可选，获取数据源信息
   - is_enabled(): 可选，控制启用状态

3. 注册到系统:
   - 在 DataSourceManager._initialize_sources() 中添加
   - 或在运行时使用 add_source() 方法

4. 配置管理:
   - 在 config.yaml 中添加配置项
   - 支持启用/禁用、API密钥等配置
    """)


if __name__ == "__main__":
    try:
        demonstrate_custom_sources()
        show_extension_patterns()
        
        print("\n✅ 自定义数据源示例完成！")
        print("\n💡 提示:")
        print("  - 继承 DataSource 基类实现新数据源")
        print("  - 使用工厂函数或直接实例化")
        print("  - 注意反爬虫机制和API限制")
        print("  - 测试通过后再集成到主系统")
        
    except Exception as e:
        print(f"\n❌ 示例执行失败: {e}")
        import traceback
        traceback.print_exc()
